/*++

  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
                                                                                   
  SPDX-License-Identifier: BSD-2-Clause-Patent

                                                                                   


Module Name:

  Tpm.h

Abstract:


--*/

#ifndef __EFI_TPM_MP_DRIVER_PROTOCOL_H__
#define __EFI_TPM_MP_DRIVER_PROTOCOL_H__


#define EFI_TPM_MP_DRIVER_PROTOCOL_GUID \
  { 0xde161cfe, 0x1e60, 0x42a1, 0x8c, 0xc3, 0xee, 0x7e, 0xf0, 0x73, 0x52, 0x12 }


EFI_FORWARD_DECLARATION (EFI_TPM_MP_DRIVER_PROTOCOL);

#define TPM_DRIVER_STATUS         0
#define TPM_DEVICE_STATUS         1

#define TPM_DRIVER_OK             0
#define TPM_DRIVER_FAILED         1
#define TPM_DRIVER_NOT_OPENED     2
#define TPM_DEVICE_OK             0
#define TPM_DEVICE_UNRECOVERABLE  1
#define TPM_DEVICE_RECOVERABLE    2
#define TPM_DEVICE_NOT_FOUND      3

//
// Prototypes for the TPM MP Driver Protocol
//

/**
  This service Open the TPM interface

  @param[in] This             A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.

  @retval  EFI_SUCCESS        Operation completed successfully
  @retval  EFI_DEVICE_ERROR   The command was unsuccessful
  @retval  EFI_NOT_FOUND      The component was not running

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TPM_MP_INIT) (
  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This
  );

/**
  This service close the TPM interface and deactivate TPM

  @param[in] This            A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.

  @retval EFI_SUCCESS        Operation completed successfully
  @retval EFI_DEVICE_ERROR   The command was unsuccessful
  @retval EFI_NOT_FOUND      The component was not running

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TPM_MP_CLOSE) (
  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This
  );

/**
  This service get the current status infomation of TPM

  @param[in]  This                  A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
  @param[in]  ReqStatusType	        Requested type of status information, driver or device.
  @param[in]  Status	              Pointer to the returned status.

  @retval  EFI_SUCCESS              Operation completed successfully
  @retval  EFI_DEVICE_ERROR         The command was unsuccessful
  @retval  EFI_INVALID_PARAMETER    One or more of the parameters are incorrect
  @retval  EFI_BUFFER_TOO_SMALL     The receive buffer is too small
  @retval  EFI_NOT_FOUND            The component was not running

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TPM_MP_GET_STATUS_INFO) (
  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This,
  IN UINT32				                ReqStatusType,
  OUT UINT32				              *Status
  );

/**
  This service transmit data to the TPM and get response from TPM

  @param[in] This                  A pointer to the EFI_TPM_MP_DRIVER_PROTOCOL.
  @param[in] TransmitBuf	         Pointer to a buffer containing TPM transmit data.
  @param[in] TransmitBufLen	       Sizeof TPM input buffer in bytes.
  @param[in] ReceiveBuf	           Pointer to a buffer containing TPM receive data.
  @param[in]  ReceiveBufLen	       On input, size of TPM receive buffer in bytes.
                                   On output, number of bytes written.

  @retval  EFI_SUCCESS             Operation completed successfully
  @retval  EFI_DEVICE_ERROR        The command was unsuccessful
  @retval  EFI_INVALID_PARAMETER   One or more of the parameters are incorrect
  @retval  EFI_BUFFER_TOO_SMALL    The receive buffer is too small
  @retval  EFI_NOT_FOUND           The component was not running

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TPM_MP_TRANSMIT) (
  IN EFI_TPM_MP_DRIVER_PROTOCOL   *This,
  IN UINT8				  	            *TransmitBuffer,
  IN UINT32			  	              TransmitBufferLen,
  OUT UINT8				  	            *ReceiveBuf,
  IN OUT UINT32			  	          *ReceiveBufLen
  );



typedef struct _EFI_TPM_MP_DRIVER_PROTOCOL {
  EFI_TPM_MP_INIT			              Init;
  EFI_TPM_MP_CLOSE			            Close;
  EFI_TPM_MP_GET_STATUS_INFO 		    GetStatusInfo;
  EFI_TPM_MP_TRANSMIT		            Transmit;
} EFI_TPM_MP_DRIVER_PROTOCOL;

extern EFI_GUID gEfiTpmMpDriverProtocolGuid;

#endif
